<?php
namespace app\utils;


/**
 * Author:Panda
 * Email:joeyoung0314@qq.com
 * Class LogUtil
 * @package App\Utils
 */
class LogUtil {
    /**==============日志系统==============**/
    private static int $size = 2;// (单位M) 避免单个日志文件太大 请设置单个文件最大存储
    static $logArr = array();
    static $logRootPath = '';//日志根目录
    static $logExtPath = '';//日志根目录02
    static $logExtTypePath = 'api/';//默认通道Api

    public static function getInstance($logExtTypePath){
        self::$logExtTypePath = $logExtTypePath;
    }

    /**
     * 记录各类日志
     * 日志级别：普通
     * @param string $controller 控制器
     * @param string $action 方法
     * @param ...$content //日志参数
     */
    public static function insert(string $controller,string $action, ...$content){
        self::writeLog($content,'Api-Middleware-Log', 'request_log',"{$controller}/{$action}",'local.INFO');
    }

    /**
     * debug 日志
     * @param ...$content
     */
    public static function debug(...$content){
        self::writeLog($content,'Api-Middleware-Log', 'request_log',"debug",'local.WARNING');
    }

    /**
     * 日志级别：普通
     * @param string $logTitle 日志名称
     * @param string $logName 日志目录
     * @param string $logFile 日志文件名
     * @param array $content 日志参数
     */
    public static function info($logTitle = '', $logName = 'Common', $logFile = 'common',$content = [] ){
        self::writeLog($content,$logName,$logFile,$logTitle,'local.INFO');
    }

    /**
     * 日志级别：警告
     * @param string $logTitle 日志名称
     * @param string $logName 日志目录
     * @param string $logFile 日志文件名
     * @param array $content 日志参数
     */
    public static function warning($logTitle = '', $logName = 'Common', $logFile = 'common',$content = [] ){
        self::writeLog($content,$logName,$logFile,$logTitle,'local.WARNING');
    }

    /**
     * 日志级别：错误
     * @param string $logTitle 日志名称
     * @param string $logName 日志目录
     * @param string $logFile 日志文件名
     * @param array $content 日志参数
     */
    public static function error($logTitle = '', $logName = 'Common', $logFile = 'common',$content = [] ){
        self::writeLog($content,$logName,$logFile,$logTitle,'local.ERROR');
    }

    /**
     * 日志内容保存
     * @param $content
     * @param string $logName 日志模块名称
     * @param string $logFile 日志内容
     * @param string $logTitle 日志内容头部
     * @param string $status
     *
     */
    private static function writeLog($content, $logName = 'Common', $logFile = 'common', $logTitle = '',$status = 'INFO') {
        $logPath = $logName.'_'.$logFile;
        $logWhite = self::whiteLog();
        if(in_array($logPath,$logWhite)) return;//验证日志黑名单
        //获取日志文件目录
        if (empty(self::$logRootPath)) self::$logRootPath = realpath(ROOT_PATH) . '/runtime/Log/'.self::$logExtTypePath;

        if (empty(self::$logExtPath))  self::$logExtPath  =  realpath(ROOT_PATH) . '/runtime/Log02/'.self::$logExtTypePath;

        if (empty(self::$logArr[$logName][$logFile])) {
            self::$logArr[$logName][$logFile] = '================ Start ================'.PHP_EOL;
        }

        if (is_array($content)) $content = json_encode($content, JSON_UNESCAPED_UNICODE);
        if (!empty($logTitle)) $logTitle .= '：';
        self::$logArr[$logName][$logFile] .= '['.(date('Y-m-d H:i:s')."] {$status}: {$logTitle}{$content}".PHP_EOL.PHP_EOL);
    }

    public static function close() {
        try{

            if (empty(self::$logArr)) return;

            //没有Log目录 创建Log02目录
            if(!file_exists(self::$logRootPath)){
                $tem_path = self::$logExtPath;
                if(!file_exists($tem_path)){
                    mkdir($tem_path, 0777 ,true);
                }
                $logPath = $tem_path.date('Y_m_d');
            }else{
                $logPath = self::$logRootPath.date('Y_m_d');
            }

            //创建日志文件目录
            if (!file_exists($logPath)) mkdir($logPath);

            //逐个日志文件写入
            foreach (self::$logArr as $key => $value) {
                $logDir = $logPath.'/'.$key;
                if (!file_exists($logDir)) mkdir($logDir , 0777 , true);
                self::logEnd($value, $logDir);
            }
            self::$logArr = null;
        }catch (\Exception $e){
            return;
        }
    }
    public static function logEnd($data, $logDir) {
        foreach ($data as $k => $v) {
            //获取日志文件名 避免单个日志文件太大
            $count = 1;
            while(true) {
                //生成日志文件名
                $logFile = "{$logDir}".'/'."{$k}_{$count}.log";

                //第一次写入日志
                if (!is_file($logFile)) break;

                //日志文件未大于1M
                $file = filesize($logFile) / 1024 / 1024;
                if ($file < self::$size) break;

                $count++;
            }
            $v = rtrim($v);
            $v .= PHP_EOL.'================ End ================'.PHP_EOL.PHP_EOL;

            error_log($v, 3, $logFile);
//            $ch = fopen($logFile, 'ab');
//            fwrite($ch, $v);
//            fclose($ch);
        }
    }

    /**
     * 日志黑名单
     * @return array
     */
    public static function whiteLog()
    {
        return array(
//            'Framework/PassportController_login',
        );
    }
}